package facade_pattern;

import java.util.Arrays;

/**
 * @author 申书航
 * @version 1.0
 * 抽象类，代表矿工的基本行为和属性
 */
public abstract class DwarfMineWorker {

    /**
     * 获取矿工的名字
     * @return 矿工的名字
     */
    public abstract String name();

    /**
     * 矿工的工作行为
     */
    public abstract void work();

    /**
     * 矿工睡觉
     */
    public void goToSleep() {
        System.out.println(name() + "睡觉");
    }

    /**
     * 矿工起床
     */
    public void wakeUp() {
        System.out.println(name() + "起床");
    }

    /**
     * 矿工回家
     */
    public void goHome() {
        System.out.println(name() + "回家");
    }

    /**
     * 矿工进入矿山
     */
    public void goToMine() {
        System.out.println(name() + "进入矿山");
    }

    /**
     * 行为枚举，定义矿工可执行的动作
     */
    enum Action {
        SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK;
    }

    /**
     * 执行具体的矿工动作，根据传入的行为枚举值
     * @param action 矿工的行为
     */
    private void action(Action action) {
        switch (action) {
            case SLEEP:
                goToSleep();
                break;
            case WAKE_UP:
                wakeUp();
                break;
            case GO_HOME:
                goHome();
                break;
            case GO_TO_MINE:
                goToMine();
                break;
            case WORK:
                work();
                break;
            default:
                System.out.println("不加钱，休想！");
        }
    }

    /**
     * 执行一系列的矿工动作
     * @param actions 一系列矿工的行为
     */
    public void action(Action... actions) {
        Arrays.stream(actions).forEach(this::action);
    }

}
